home *** CD-ROM | disk | FTP | other *** search
- { This little program shows how to count or act on external events. It works
- since 3 years in a industial application without any problems.
- It's interrupt driven to make sure, that no event is missed.
-
- You need a male DB25 connector (the counterpart of the PC's printer
- connector), and at least 2 wires. A switch is recommend.
- What you have to do is to connect 2 wires to the male DB25 connector.
- One wire to pin 10 and the other to pin 25.
-
- IRQ-inputline
- +----------------+
- | |
- - 13 |10 1
- switch - - - - - - - - - - - - -
- - - - - - - - - - - - - - backview of connector
- | 25| 14
- +-----------+
- ground
-
- Pin 10 is the acknowledge line (input) witch normaly is connected to a
- printer output signal. A internal resistor with 4,7k_ pulls this pin up to
- 5V TTL level. So the normal level is 5V TTL. With some software setup
- this input line can perform interrupts when the signal is forced from high
- to low level. This can be done with a simple switch that connects pin10 to
- ground. The little "framework" above shows it.
-
- In the program below events up to 35kHz can be sensed.
-
- Try ($define IRQ7) first. If this doesn't work then use ($define IRQ5).
- If you do your own interrupt service, consider that it must be a far proc.
-
- There's a lot of what you can do with this - go external...
-
- Dec. 12, 1995, Udo Juerss, 57078 Siegen, Germany, CompuServe [101364,526]}
-
- {$define IRQ7}
- uses
- Dos,
- Crt;
- {---------------------------------------------------------------------------}
-
- var
- Lpt : Word;
- InterruptCount : Word;
- LptOrgVec : Procedure;
- {---------------------------------------------------------------------------}
-
- procedure SetPortBit(PortAdr:Word; Bit:Byte); assembler;
- asm
- mov dx,PortAdr
- in al,dx
- mov cl,Bit
- and cl,7
- mov ah,1
- shl ah,cl
- or al,ah
- out dx,al
- end;
- {---------------------------------------------------------------------------}
-
- procedure ClearPortBit(PortAdr:Word; Bit:Byte); assembler;
- asm
- mov dx,PortAdr
- in al,dx
- mov cl,Bit
- and cl,7
- mov ah,1
- shl ah,cl
- not ah
- and al,ah
- out dx,al
- end;
- {---------------------------------------------------------------------------}
-
- function GetLptPort(LptNr:Byte):Word;
- begin
- GetLptPort:=MemW[$0040:8 + (LptNr - 1) * 2];
- end;
- {---------------------------------------------------------------------------}
-
- {$F+}
- procedure NewLptInt; interrupt;
- begin
- Sound(880); {Quittungssignal ausgeben}
- Delay(5);
- NoSound;
-
- Inc(InterruptCount); {Interruptzdhler erhvhen}
-
- SetPortBit(Lpt + 1,6); {Bit 6 im Interrupt Register setzen}
-
- asm {Interrupt Anforderung lvschen}
- mov al,20h
- out 20h,al
- end;
- end;
- {$F-}
- {---------------------------------------------------------------------------}
-
- begin
- ClrScr;
-
- Lpt:=GetLptPort(1); {Port Adresse der 1. Schnittstelle}
- SetPortBit(Lpt + 1,6); {Bit 6 im Interrupt Register setzen}
- SetPortBit(Lpt + 2,4); {Bit 4 im Kontroll Register setzen}
-
- {$ifdef IRQ7}
- ClearPortBit($21,7); {IRQ7 im Intrrupt-Controller freigeben}
- GetIntVec($0F,@LptOrgVec); {Bisherigen Interrupt Vektor holen}
- SetIntVec($0F,@NewLptInt); {Vektor f|r neuen Interrupt setzen}
- {$else}
- ClearPortBit($21,5); {IRQ5 im Intrrupt-Controller freigeben}
- GetIntVec($0D,@LptOrgVec); {Bisherigen Interrupt Vektor holen}
- SetIntVec($0D,@NewLptInt); {Vektor f|r neuen Interrupt setzen}
- {$endif}
-
- Writeln('Press the interrupt-switch to test response, or any key to quit...');
- Writeln('Interrupts occurrences : ');
- InterruptCount:=0;
- repeat
- GotoXY(25,2);
- Write(InterruptCount:5);
- until KeyPressed;
- ReadKey;
-
- {$ifdef IRQ7}
- SetPortBit($21,7); {IRQ7 im Intrrupt-Controller sperren}
- SetIntVec($0F,@LptOrgVec); {Vektor von urspr|nglichem Interrupt setzen}
- {$else}
- SetPortBit($21,5); {IRQ5 im Intrrupt-Controller sperren}
- SetIntVec($0D,@LptOrgVec); {Vektor von urspr|nglichem Interrupt setzen}
- {$endif}
- end.